package com.ruoyi.flow.common.utils;

import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import static com.google.common.base.Preconditions.checkArgument;
import static com.google.common.base.Preconditions.checkNotNull;
import static com.google.common.base.Preconditions.checkState;

/**
 * 文件操作工具类
 * 实现文件的创建、删除、复制、压缩、解压以及目录的创建、删除、复制、压缩解压等功能
 *
 * @author ThinkGem
 * @version 2013-06-21
 */
public class FileUtils extends org.apache.commons.io.FileUtils {

    private static Logger log = LoggerFactory.getLogger(FileUtils.class);

    /**
     * 创建单个文件
     *
     * @param destFile 待创建的目标文件
     * @return 如果创建成功，则返回true，否则返回false
     */
    public static boolean createFile(File destFile) {
        checkNotNull(destFile);
        if (destFile.exists()) {
            log.warn("文件 {} 已存在!", destFile.getAbsolutePath());
            return true;
        }
        if (destFile.isDirectory()) {
            log.warn("文件 {} 为目录，不能创建目录!", destFile.getAbsolutePath());
            return false;
        }
        if (!destFile.getParentFile().exists()) {
            // 如果文件所在的目录不存在，则创建目录
            if (!destFile.getParentFile().mkdirs()) {
                log.error("创建文件所在的目录失败!");
                return false;
            }
        }

        // 创建文件
        try {
            if (destFile.createNewFile()) {
                return true;
            } else {
                log.error("文件 {} 创建失败!", destFile.getAbsolutePath());
                return false;
            }
        } catch (Exception e) {
            e.printStackTrace();
            log.error("文件 {} 创建失败!", destFile.getAbsolutePath());
            return false;
        }

    }

    /**
     * 创建目录
     *
     * @param descDir 待创建的目录
     * @return 如果创建成功，则返回true，否则返回false
     */
    public static boolean createDirectory(File descDir) {
        checkNotNull(descDir);
//        checkArgument(descDir.isDirectory(),"目标目录 {} 不是文件夹",descDir);
        if (descDir.exists()) {
            log.warn("目录 {} 已存在!", descDir);
            return true;
        }
        // 创建目录
        if (descDir.mkdirs()) {
            return true;
        } else {
            log.debug("目录 {} 创建失败!", descDir);
            return false;
        }

    }

    /**
     * 修复路径，将 \\ 或 / 等替换为 File.separator
     *
     * @param path
     * @return
     */
    public static String path(String path) {
        String p = StringUtils.replace(path, "\\", "/");
        p = StringUtils.join(StringUtils.split(p, "/"), "/");
        if (!StringUtils.startsWithAny(p, "/") && StringUtils.startsWithAny(path, "\\", "/")) {
            p += "/";
        }
        if (!StringUtils.endsWithAny(p, "/") && StringUtils.endsWithAny(path, "\\", "/")) {
            p = p + "/";
        }
        if (path != null && path.startsWith("/")) {
            p = "/" + p; // linux下路径
        }
        return p;
    }

    /**
     * 从文件中基于正则表达式提取出符合的字符串
     *
     * @param srcFile 源文件
     * @param regexp  正则表达式
     * @return
     */
    public static List<String> extract(File srcFile, String regexp) {
        checkNotNull(srcFile);
        checkState(srcFile.exists(), "源文件 {} 不存在！", srcFile.getAbsolutePath());
        checkState(StringUtils.isNotEmpty(regexp), "正则表达式不能为NULL或者为空");

        List<String> results = new ArrayList<>();
        try {
            String tempStr = readFileToString(srcFile, "UTF-8");
            Pattern pattern = Pattern.compile(regexp);
            Matcher matcher = pattern.matcher(tempStr);
            while (matcher.find()) {
                String str = matcher.group();
                results.add(str);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return results;
    }

    /**
     * 判断File是否为Null或者是否不存在
     * <br/>
     * 如果给定的srcFile对象为Null或者不存在，就返回true，否则返回false
     *
     * @param srcFile
     * @return
     */
    public static boolean isNullOrNotExist(File srcFile) {
        if (srcFile == null) {
            return true;
        }
        if (!srcFile.exists()) {
            return true;
        }
        return false;
    }

    /**
     * 判断File是否是空文件
     *
     * @param srcFile
     * @return
     */
    public static boolean isEmptyFile(File srcFile) {
        checkArgument(!isNullOrNotExist(srcFile), "srcFile is null or not exist.");
        if (srcFile.length() == 0) {
            return true;
        }
        return false;
    }

    /**
     * 获取Tomcat服务器路径
     *
     * @return
     */
    public static String getServerPath() {
        return System.getProperty("catalina.home");
    }

}
